import BAPI from "./api"
import security from "./security";

// 应用上下文
let CONTEXT_PATH = 'http://localhost:7081/sea';
// 模式：测试及其它
let MODEL = 'debug';

/**
 * 用户身份信息
 *
 * 请勿完全信任前端的鉴权信息，业务关键节点，需要注意甄别客户的真实身份，避免遭到攻击（垂直越权、水平越权等）。
 * @type {{}}
 */
let user_info = {username: 'admin', account: 'admin', groupId: '0001', roleId: '0001', no: '0001'};
/**
 * 用户身份令牌
 * @type {string}
 */
let user_token = '';
/**
 * 刷新令牌
 * @type {string}
 */
let refresh_token = '';

/**
 * 应用上下文
 * @constructor
 */
function ApplicationContext() {
}

/**
 * 获取应用上下文路径
 *
 * @returns {string}
 */
ApplicationContext.prototype.contextPath = function () {
    return CONTEXT_PATH;
};

/**
 * 是否是 debug 模式
 *
 * 后台数据使用测试数据
 *
 * @returns {boolean}
 */
ApplicationContext.prototype.isDebug = function () {
    return MODEL === 'debug';
};

/**
 * 全局的登录配置
 *
 * 登录完成之后，需要装载用户的登录信息
 */
ApplicationContext.prototype.login = function (username, password) {
    return new Promise(resolve => {
        BAPI.user().login(username, password).then(ret => {
            if (ret.code === 0) {
                // 身份令牌
                user_token = ret.data;
                BAPI.user().detail().then(ret => {
                    console.info('user login');

                    // 用户信息
                    user_info = ret.data;

                    // 用户鉴权信息
                    security.setPrincipal(user_info.username);

                    resolve(user_info);
                });
            }
        })
    })
};

/**
 * 全局登出配置
 *
 * 登出之后，需要清除用户的登录信息
 */
ApplicationContext.prototype.logout = function () {
    console.info('user logout');

    // 用户信息
    user_info = undefined;

    // 用户鉴权信息
    security.setRole(undefined);
    security.setPermit(undefined);
    security.setPrincipal(undefined);
};

/**
 * 添加客户信息
 *
 * 如果有完整的鉴权机制，推荐使用这个函数，不需要反复刷新用户数据
 *
 * @param user 用户信息
 * @returns void
 */
ApplicationContext.prototype.setUserInfo = function (user) {
    user_info = user;
};

/**
 * 获取客户信息
 *
 * @returns {Object}
 */
ApplicationContext.prototype.getUserInfo = function () {
    return user_info;
};

/**
 * 客户登出，置空客户信息
 *
 * 如果有完整的鉴权机制，推荐使用这个函数，不需要反复刷新用户数据
 *
 * @returns void
 */
ApplicationContext.prototype.removeUserInfo = function () {
    user_info = undefined;
};

/**
 * 获取用户的账号
 *
 * @returns {String}
 */
ApplicationContext.prototype.getUserAccount = function () {
    return user_info.account;
};

/**
 * 获取用户的昵称
 *
 * @returns {Object}
 */
ApplicationContext.prototype.getUsername = function () {
    return user_info.username;
};

/**
 * 获取用户的工号
 *
 * @returns {Object}
 */
ApplicationContext.prototype.getUserNo = function () {
    return user_info.no;
};

/**
 * 获取用户的部门 ID
 *
 * @returns {Object}
 */
ApplicationContext.prototype.getUserDeptId = function () {
    return user_info.groupId;
};

/**
 * 获取客户角色 ID
 *
 * @returns {Object}
 */
ApplicationContext.prototype.getUserRoleId = function () {
    return user_info.roleId;
};

export default new ApplicationContext();
